//jdk用的是：D:\JAVA-jdk\corretto-1.8.0_312
//系统Path环境变量配的是：D:\JAVA-jdk\corretto-1.8.0_312\bin
//JAVA_HOME：D:\JAVA-jdk\corretto-1.8.0_312

//所有命令执行在：PS E:\桌面\JAVA面试\Java语法_JDK工具类_框架学习\基础语法\类加载器\src>
//这个目录就是Application类加载器的默认classpath，回去这个路径里面找文件

//编译：
//javac -source 1.8 -target 1.8 -encoding UTF-8 测试自定义类加载器.java 自定义类加载器.java
//运行：
//java 测试自定义类加载器
public class 测试自定义类加载器 {
    public static void main(String[] args)  throws Exception {
        System.out.println("System ClassLoader: " + ClassLoader.getSystemClassLoader());
        System.out.println("测试自定义类加载器 loaded by: " + 测试自定义类加载器.class.getClassLoader());

        // 创建自定义类加载器（指向 plugins 目录）
        自定义类加载器 loader = new 自定义类加载器("../other");

        // 方式 A：使用 loadClass（遵循父委托机制）
        Class<?> cls = loader.loadClass("org.huang.TestClass");
        System.out.println("Loaded class: " + cls + " by " + cls.getClassLoader());

        Object instance = cls.getDeclaredConstructor().newInstance();
        cls.getMethod("print").invoke(instance);

        // 方式 B：直接调用 findClass（绕过父委托——仅作演示）
        // 注意：如果父类加载器已经加载了该类，则 findClass 会抛出 ClassNotFoundException
        try {
            自定义类加载器 loader2 = new 自定义类加载器("../other", null); // 父为 null 表示没有父加载器
            Class<?> cls2 = loader2.findClass("org.huang.TestClass"); // 直接查找
            System.out.println("Direct findClass result: " + cls2 + " by " + cls2.getClassLoader());
            Object ins2 = cls2.getDeclaredConstructor().newInstance();
            cls2.getMethod("print").invoke(ins2);
        } catch (Exception e) {
            System.err.println("Direct findClass failed: " + e);
        }
    }
    
}
